﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using blacksoft.Models;
using System.Text;
using System.Security.Cryptography;
using System.Net.Mail;
using System.IO;
using blacksoft.Constantes;

namespace blacksoft.Controllers
{//Andre5223 	52236718
    public class GenerarUsuarioController : Controller
    {
        private inf245travelbusEntities db = new inf245travelbusEntities();
        // GET: GenerarUsuario
        public ActionResult Index()
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.SEGURIDAD))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
                      //ESTOY LOGUEADO Y TENGO PERMISO
            var persona = db.Persona.Include(p => p.Terminal);
            var persona2 = persona.Where(s => s.TipoPersona==2);
                    //PUEDO VER A TODOS O SOLO DATOS DE MI TERMINAL
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL))
            {
                var persona3 = persona2.Where(s => s.IDTerminal == (int)Session["IDTerminal"]);
                return View(persona3.ToList());
            }
            return View(persona2.ToList());
        }
        [HttpPost]
        public ActionResult Index(string Nombre,string DNI)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.SEGURIDAD))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            var persona = db.Persona.Include(p => p.Terminal);
            if (!String.IsNullOrEmpty(Nombre))
            {
                persona = persona.Where(s => s.Nombre.Contains(Nombre));
            }
            if (!String.IsNullOrEmpty(DNI))
            {
                persona = persona.Where(s => s.DNI.Contains(DNI));
            }
            persona=persona.Where(s => s.TipoPersona == 2);
            return View(persona.ToList());
        }




        // GET: GenerarUsuario/Details/5
        public ActionResult Details(int? id)

        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.SEGURIDAD))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Persona persona = db.Persona.Find(id);
            if (persona == null)
            {
                return HttpNotFound();
            }
            if (persona.conCuenta==null||!(bool)persona.conCuenta)
            {
                TempData["NoTieneUnUsuarioAun"] = "Esa Persona no cuenta con un Usuario aun";
                return RedirectToAction("Index");
            }


            Reset reset = new Reset();
            reset.ApellidoMaterno = persona.ApellidoMaterno;
            reset.ApellidoPaterno = persona.ApellidoPaterno;
            reset.Nombre = persona.Nombre;
            reset.CargoPersonal = persona.CargoPersonal;
            reset.IdPersona = persona.IDPersona;
            return View(reset);
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Details([Bind(Include = "IdPersona,Nombre,ApellidoPaterno,ApellidoMaterno,CargoPersonal,ContraseñaNueva")]Reset miReset)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.SEGURIDAD))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            if (ModelState.IsValid)
            {
                if (gethash(miReset.ContraseñaNueva).Equals((string)Session["Contraseña"]))
                    {   var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                        var random = new Random();
                        var result = new string(Enumerable.Repeat(chars, 8)
                                                .Select(s => s[random.Next(s.Length)]).ToArray());
                        var usuarios = from p in db.Usuario
                                       where p.IDPersona==miReset.IdPersona
                                       select p.IDUsuario;
                        Usuario myuser = db.Usuario.Find((int)usuarios.First());
                        myuser.Contraseña = gethash(result);
                        db.Entry(myuser).State = EntityState.Modified;
                        db.SaveChanges();
                        EnviarCorreo(db.Persona.Find(miReset.IdPersona).Email, @"Su contraseña fue cambiada a " + result);
                        TempData["ExitoAlResetarContraseña"] = "Se envio la nueva contraseña al mail del empleado";
                        return RedirectToAction("Index");
                    }
                var usuarios2 = from p in db.Usuario
                                where p.IDPersona == miReset.IdPersona
                               select p.IDUsuario;

                TempData["alertContraseñaIncorrecta"] = "Clave Invalida ";
                return View();
            }
            else
                return View();
        }

        // GET: GenerarUsuario/Edit/5
        public ActionResult Edit(int? id)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.SEGURIDAD))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Persona persona = db.Persona.Find(id);
            if (persona == null)
            {
                return HttpNotFound();
            }
            if (persona.conCuenta==null)
            {
                TempData["YaTieneUsuario"] = "Error al Crear Personal";
                return RedirectToAction("Index");
            }

            if ((bool)persona.conCuenta)
            {
                TempData["YaTieneUsuario"] = "Ya tiene un usuario Asignado";
                return RedirectToAction("Index");
            }

            ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre", persona.IDTerminal);
            return View(persona);
        }

        public ActionResult modificarPerfil2(int? id, int? idp, int? idu)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.SEGURIDAD))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            Usuario myuser = db.Usuario.Find((int)idu);
            myuser.IDPerfil = (int)id;
            db.Entry(myuser).State = EntityState.Modified;
            db.SaveChanges();
            Persona persona = db.Persona.Find((int)idp);
            Perfil perfil = db.Perfil.Find((int)id);
            TempData["cxah"] = "Se cambio el Perfil de " + persona.Nombre + " " + persona.ApellidoPaterno + " " + " ahora tiene el tiene el perfil de " + perfil.Nombre;
            return RedirectToAction("modificarPerfil/"+idp);
        }
        public ActionResult modificarPerfil(int? id)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.SEGURIDAD))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            
            Persona persona = db.Persona.Find(id);
            if (persona == null)
            {
                return HttpNotFound();
            }
            if (!(bool)persona.conCuenta)
            {
                TempData["NotieneUsuario"] = "No tiene un usuario Asignado";
                return RedirectToAction("Index");
            }
            TempData["Nombre"] = persona.Nombre+"  "+persona.ApellidoPaterno+"  "+persona.ApellidoMaterno;
            var usuarios = from p in db.Usuario
                           where p.IDPersona == persona.IDPersona
                           select p.IDUsuario;
            Usuario myuser = db.Usuario.Find((int)usuarios.First());
            int? idperfil = myuser.IDPerfil;
            Perfil miperfil = db.Perfil.Find(idperfil);
            TempData["PerfilActual"] = miperfil.Nombre;
            ViewBag.IDPersona = id;
            ViewBag.IDUsuario = myuser.IDUsuario;
            return View(db.Perfil.ToList());
        }


        // POST: GenerarUsuario/Edit/5
        // Para protegerse de ataques de publicación excesiva, habilite las propiedades específicas a las que desea enlazarse. Para obtener 
        // más información vea http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "IDPersona,Nombre,ApellidoPaterno,ApellidoMaterno,DNI,FechaNacimiento,RazonSocial,RUC,Direccion,Telefono,TipoPersona,CargoPersonal,PuntosAcumulados,FechaRegistro,Estado,IDTerminal,Email")] Persona persona)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.SEGURIDAD))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            if (ModelState.IsValid)
            {
                string hash;
                persona.conCuenta=true;
                db.Entry(persona).State = EntityState.Modified;
                Usuario nuevoUsuario = new Usuario();
                string name = persona.Nombre.Length > 5 ? persona.Nombre.Substring(0, 5) : persona.Nombre;
                name=name+persona.DNI.Substring(0, 4);
                nuevoUsuario.Nombre = name;
                using (MD5 md5Hash = MD5.Create())
                {
                    hash = GetMd5Hash(md5Hash, persona.DNI);
                }
                nuevoUsuario.Contraseña = hash;
                nuevoUsuario.IDPersona = persona.IDPersona;
                nuevoUsuario.IDPerfil = 6;
                db.Usuario.Add(nuevoUsuario);
                db.SaveChanges();
                TempData["EXITO_A_CREAR_USUARIO"] = "SE CREO EL USUARIO CON EXITO SUS DATOS DE CONEXION FUERON ENVIADOS AL CORREO REGISTRADO";
                //DEBERIA MANDAR EL CORREO ACA CARHAJHO
                EnviarCorreo(db.Persona.Find(persona.IDPersona).Email, @"Su Usuario es   "+name+"           Su contraseña es   " + persona.DNI,"Su Cuenta de Intranet - BlAckSoFt ","Su usuario y contraseña estan el ARcHivo AdJunto");
                return RedirectToAction("Index");
            }
            ViewBag.IDTerminal = new SelectList(db.Terminal, "IDTerminal", "Nombre", persona.IDTerminal);
            return View(persona);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private static string GetMd5Hash(MD5 md5Hash, string input)
        {

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }
        private static string gethash(string a)
        {
            using (MD5 md5Hash = MD5.Create())
            {
                return GetMd5Hash(md5Hash, a);

            }
        }

        private static void EnviarCorreo(string receiver,string contenido)
        {
            //Configurando el cliente SMTP
            SmtpClient client = new SmtpClient();
            client.Host = "smtp.gmail.com";
            client.Port = 587;
            client.EnableSsl = true;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential("lycanthrophy67@gmail.com", "96066macedonio");

            //Preparando archivo adjunto
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(contenido));

            //Enviando correo
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("lycanthrophy67@gmail.com");
            mail.To.Add(new MailAddress(receiver));
            mail.Subject = "PASSRESET - TRAVELBUS";
            mail.IsBodyHtml = true;
            mail.Body = "<h2>Su contraseña Fue cambiada, la nueva contraceña esta en el archivo adjunto</h2><br/><br/>Visiten: <a href='http://xamldevelopment.blogspot.com'>XAML Development</a>";
            mail.Attachments.Add(new Attachment(ms, "Documento.txt"));
            client.Send(mail);
        }
        private static void EnviarCorreo(string receiver, string contenido,string sub, string cuerpo)
        {
            //Configurando el cliente SMTP
            SmtpClient client = new SmtpClient();
            client.Host = "smtp.gmail.com";
            client.Port = 587;
            client.EnableSsl = true;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential("lycanthrophy67@gmail.com", "96066macedonio");

            //Preparando archivo adjunto
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(contenido));

            //Enviando correo
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("lycanthrophy67@gmail.com");
            mail.To.Add(new MailAddress(receiver));
            mail.Subject = sub;
            mail.IsBodyHtml = true;
            mail.Body = "<h2>"+cuerpo+"</h2><br/><br/>";
            mail.Attachments.Add(new Attachment(ms, "Documento.txt"));
            client.Send(mail);
        }





    }
}
